首先, 讓我們認識響應式編程! 顧名思義, 響應式編程的目的是一種編程的方法, 其中心想法不同於物件導向編程是面對物件為主, 響應式編程是以面對資料變化為主.
我們在維基百科就可以很清楚的知道響應式編程的目的是面對資料流變化:
在電腦中,回應式程式設計或反應式程式設計(英語:Reactive programming)是一種面向資料流和變化傳播的程式設計範式。這意味著可以在程式語言中很方便地表達靜態或動態的資料流,而相關的計算模型會自動將變化的值通過資料流進行傳播。 wiki
那什麼是面向資料流? 什麼是變化傳播?
最常見的面向資料流的實際應用就是試算表 (spread sheet),
我們來談談一個典型的試算表。 我們有一個月銷售產品清單,並希望通過添加單價與數量來計算盈利。 試算表有A1到A10的單元格記錄我們的單日產品價格,單元格B1到 B10包含當日的銷售數量。在C1到C10的單元格中,我們希望看到當日的盈利情況。
在單元格C1中,我們有一個公式:= A1 * B1,單元格 C2 = A2 * B2 等。因此,如果A1有100元,B1 有 10 的銷售數量,C1將有 1000 元。
但是,如果有顧客在購買後退款,我們只要在單元格A1上修改數量,就會一樣更新C單元格。我們沒有告訴單元格C更新, 單元格 C 會自己更新,因為這些單元格依賴的價值發生了變化(資料流變化)。
如果你有聽說過設計模式的話, 響應式編程很常與觀察者模式一起討論. 在設計模式解析與活用(Design pattern explained) 中是這麼定義觀察者模式的意圖:
在物件之間定義一種一對多的相依關係, 如此當一個物件的狀態改變時, 所有相依者都將得到通知並自動更新.
而這時候就跟變化傳播有關係了,比如我們在點名時, 會聽到一連串的名字, 而只有在聽到自己的名字時, 我們才會回應. 在 Swift 有 didSet
的方式能讓物件的某個屬性在變化的時候執行一定的指令.
而響應式編程中最重要的莫過於非同步的處理. 由於非同步的關係, 我們需要在非同步的處理時間完成之後, 執行一定的指令, 在一般未使用 Combine 的情形時, 可以使用尾隨閉包(trailing clousure) 或是 Callback 的方式執行, 錯誤處理可以使用 Result 的方式分別處理, 而在使用 Combine 的之後, 透過操作子 (Operator), 可以將控制流程轉換成更為宣告式的方式呈現.
使用響應式編程之後:
可以使用一些方便的操作子來觀察多個元素的更動。
可以方便執行異步操作可能失敗的邏輯。
可以方便的根據時間更改邏輯產生的內容。
處理這些事件流的流程,時間,錯誤發生時的錯誤, 以及協調系統如何響應所有這些事件, 就是函數響應式編程的核心。
簡單測驗:
Optional.map()
的功能是什麼?URLSession.dataTask()
whoami:
我是游諭 ytyubox